<?php
/**
 * Created by PhpStorm.
 * User: jojo
 * Date: 5/20/2015
 * Time: 3:01 PM
 */


class Cx消息路由
{


    public static  function fj接收微信消息(DoMessage $vo当前消息)
    {
        global $G_CONFIG;
        switch ($vo当前消息->get_to_user_name()) {
            case $G_CONFIG['公众号信息'][11]['公众号OpenId']:
            case $G_CONFIG['公众号信息'][12]['公众号OpenId']:
            case $G_CONFIG['公众号信息'][13]['公众号OpenId']:
            case $G_CONFIG['公众号信息'][14]['公众号OpenId']:
                $rtn=Cy内部业务逻辑::fj接收微信消息($vo当前消息);

                while(!C返回堆栈::getInstance()->f返回数据是否为空())
                {
                    //todo 需要增加控制时间和递归次数的逻辑，以防超时或循环层数过多
                    $rtn2 = self::fl返回值路由调用($rtn);
                }
//                return $rtn;
                return $rtn;

            default:
                echo "未识别消息来自哪个公众号";
                break;
        }
    }

    public static function ff处理返回堆栈()
    {
        while(!C返回堆栈::getInstance()->f返回数据是否为空())
        {
            //todo 需要增加控制时间和递归次数的逻辑，以防超时或循环层数过多
            $rtn2 = self::fl返回值路由调用();
        }
//                return $rtn;
        return true;

    }


    private static function ff发送消息(C返回信息 $vo返回信息)
    {
        global $G_CONFIG;
        switch ($vo返回信息->get公众号Id()) {
            case 11:
            case 12:
            case 13:
            case 14:
                if ("文本消息"==$vo返回信息->get消息类型())
                    CTo微信::ff发送文本消息( $vo返回信息->get消息内容(), $vo返回信息->get用户OpenId(), $vo返回信息->get公众号Id());
                else if ("图文消息"==$vo返回信息->get消息类型())
                    CTo微信::ff发送图文消息( $vo返回信息->get消息内容(), $vo返回信息->get用户OpenId(), $vo返回信息->get公众号Id());
                else if ("任意消息"==$vo返回信息->get消息类型())
                    CTo微信::ff发送消息( $vo返回信息->get消息内容(), $vo返回信息->get用户OpenId(), $vo返回信息->get公众号Id());
                else  "未识别发送消息的消息类型";
//                echo "发送消息" . $vo返回信息->get消息内容() . "<br/>";
                break;

            default:
                echo "未识别发送消息的公众号";
        }
        //需要调用新的信息收发类，待金龙完善类之后添加
        return true;
    }

    private static function ff发送消息_多类型(C返回信息多类型 $vo返回信息)
    {
        global $G_CONFIG;
        switch ($vo返回信息->get公众号Id()) {
            case 1:
            case 2:
            case 3:
            case 4:
            case 5:
            case 6:
            case 7:
            case 8:
            case 9:
            case 10:
            case 11:
            case 12:
            case 13:
            case 14:
                logger()->logDebug2($vo返回信息);

                    CTo微信::ff发送消息_多类型( $vo返回信息, $vo返回信息->get用户OpenId(), $vo返回信息->get公众号Id());
                break;

            default:
                echo "未识别发送消息的公众号";
        }
        //需要调用新的信息收发类，待金龙完善类之后添加
        return true;
    }


    //是循环调用直到结束
    //如果任何错误出现,就直接返回错误
    //只将错误信息返回用户
    //不考虑回滚,以后考虑
    private static function  fl返回值路由调用()
    {

        $rtn = false;
        $结果 = C返回堆栈::getInstance()->get_最后数据();
        C返回堆栈::getInstance()->pop_数据();

        //读事件方法调用表
        //在2015-4-25日讨论，认为在5月份上线的版本中不会出现返回事件的情况，只会有返回信息的情况
        if ($结果 instanceof C返回事件) {
            $rtn = Cy内部业务逻辑::fj接收微信消息($结果);
//            $rtn = Ck控制器::fc处理事件($结果->vs公众号openId, $结果->vs用户openId, Constants::t通道_微信, $结果, $结果);

            //$do = new Do事件方法调用();
            //$do->loadById($结果->getVs事件());
            //$rtn = C控制器::fz执行调用($do);
            return $rtn;
        }

        if ($结果 instanceof C返回信息) {
            $rtn = self::ff发送消息($结果);
        }
        if ($结果 instanceof C返回信息多类型) {
            $rtn = self::ff发送消息_多类型($结果);
        }


        return $rtn;

    }
}